Skip to content

skills(data, query, ui): with no searchableFields declared, a field marked searchable: true joins the default search set - #29912

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-yb1wlg
Nov 3, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-yb1wlg

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Requested by Irene · project thread

Fixes #29395

Clause-②: no
Metadata-protocol: none

Model: claude-fable-5-1 mandate waived by the maintainer (Fable quota exhausted); developed on Opus; contract review by triage.

维护者速读

What changes

The rule is read from the merged code, not the card: packages/spec/src/data/search-fields.ts (autoDefaultFields, admittedBySearchableFlag, SEARCH_FLAG_EXCLUDED_TYPES = {secret, password, vector}) and the FieldSchema.searchable describe in packages/spec/src/data/field.zod.ts.

  1. skills/objectstack-data/SKILL.md § Search Fields. The auto-default sentence now adds "plus every field marked searchable: true, of any type except secret / password / vector or a virtual formula", then the unchanged-behaviour line: searchable: false, the default, never removes a field the type default scans; declare searchableFields to choose the set.
  2. skills/objectstack-query/SKILL.md (the "Omit it to search…" paragraph). The parenthesised auto-default gains the same clause, and the paragraph gains the same unchanged-behaviour line.
  3. skills/objectstack-ui/rules/list-views.md, the allowed-set table. The "declares nothing" row gains "+ every field marked searchable: true, of any type except secret / password / vector or a virtual formula", and one line under the table carries the unchanged-behaviour sentence. The "declares searchableFields" row now reads "any stored field type" (it said "whatever the field types are"), so the table no longer contradicts the refusal row below it, which refuses a virtual formula.
  4. Changeset. .changeset/29395-skills-search-auto-default.md releases @objectstack/skills as a patch, with Clause-②: no and Metadata-protocol: none: a skills/** change publishes that package, so it never takes skip-changeset.
  5. The enum half of the type default is now spelled select alone in the data skill and the list-views table. Both said select / status. status is not a FieldType member, and SEARCHABLE_ENUM_TYPES is {select}.

No eval covers the edited lines. The only search evals are a mirror-field prompt in objectstack-data/evals/hooks-security-seeds-datasources.json and a searchFields prompt in objectstack-query/evals/filters-pagination-search.json. Neither asserts on the auto-default, so no eval changed.

Token budget, paid in place (no ceiling row moved)

file tokens before → after / ceiling lines before → after
objectstack-data/SKILL.md 6123 → 6119 / 6123 466 → 464
objectstack-query/SKILL.md 4166 → 4234 / 5547 403 → 407
objectstack-ui/rules/list-views.md 3110 → 3126 / 3129 308 → 308

What paid:

  • objectstack-data (at its ceiling, headroom 0): the duplicate → Moved verbatim … § Field Groups (MVP) pointer stub and its --- separator are removed. The fieldGroups row of the optional-properties table already links the same anchor. Three phrases are also tightened: the Quick Reference lead-in, "computed and stored on write" in the nameField row (a stored computed field already says it), and "by a path that bypasses hooks" becomes "past the hooks". The formula clause (b89c05d) is paid by two restatement cuts: "no traversal" leaves the ?search=apollo line, and its home is the section's opening ("the search axis does not resolve traversal"); the // ← the mirror code comment goes, and its home is the block's first comment ("project_name is a stored, denormalized mirror of the parent's title").
  • objectstack-query: 68 tokens fit inside the existing 1381 headroom, so nothing else was cut.
  • list-views: the refusal table's two searchable-field-unknown rows (mistyped column, dotted path) become one row, and so do its two searchable-field-unsearchable rows (column outside the set, virtual formula). "at all three layers" is dropped from the searchableFields: [] row. For the formula clause, the refusal row drops its "(nothing stored to scan)", whose home is now the allowed-set table's "any stored field type", and that row is itself shorter than the "whatever the field types are" it replaces.

Acceptance notes

  • Contract review FAIL on c5f8165 (6606434667). M1 (changeset) and S1 (virtual formula exception) are fixed on b89c05d as above; the skip-changeset label is removed. The new clauses lengthen their lines in place (data L118 is 100 bytes, query L321 102), with no re-wrap.
  • Re-wrap. The order said no re-wrap. The query paragraph's later sentences ("resolved server-side. It can only narrow…" through "…Tier-2 knobs below.") were re-flowed, because the insertion lands mid-paragraph. The data paragraph's last line ("Views may narrow it, never widen it.") also moved. The words are unchanged. No other paragraph was touched. The reviewer may rule this a breach; the fix would be a line-preserving rewrite of those two paragraphs.
  • The new list-views line under the table is 153 bytes, on one line so as not to wrap.
  • At dispatch, no open PR edited these lines. feat(spec)!: a locale tag written in another case is corrected to its BCP-47 case #29190 and feat(app-shell): offer Disable / Enable on a suite's module rows from the served disableable verdict #28903 touch objectstack-data/SKILL.md, at the mirror-field block (L147–169) and after L378 only.
  • The branch is based on c76c0e0. No commit on main since then touches the three files, the token ratchet or search-fields.ts.

Why

#29385 (#29008) landed ruling 6573569376 letter A: with no searchableFields declared, the effective search set is the type-based auto-default plus every field marked searchable: true of any type except secret, password and vector, and the $searchFields allow-list is the same set. These three skills still taught the default as type-only. An agent following them would tell an author that searchable: true on a code or lookup field does nothing, and would treat a $searchFields override naming such a field as a 400.

Verification

Local gates on b89c05d: 44 derived, 43 exit 0, 1 not measured (`dispatch-gates --ran`)
  • On head b89c05d, node scripts/pm/dispatch-gates.mjs --commands derived 44 commands. The changeset adds 10 families, including check-empty-changeset, check-changeset-no-major and check-adr-0087-registration. Each ran with a 900 s timeout, in a tree with pnpm install --frozen-lockfile done and @objectstack/formula, @objectstack/lint and @objectstack/objectql built. Exit codes were recorded before any pipe.
  • 43 exited 0. These include node scripts/check-skills-token-ratchet.mjs and its --self-test, pnpm check:pm-skill-id-lint, node scripts/check-empty-changeset.mjs --base origin/main, pnpm --filter @objectstack/spec run check:skill-docs, pnpm check:skill-frame-sync, pnpm check:skill-identifier-liveness, pnpm check:doc-authoring and pnpm check:lean-entry-closure.
  • pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: no dist/ for most packages). It needs a full pnpm build, and this diff touches no packages/**. It is reported as not measured, and CI's run on this head is the measurement.
  • dispatch-gates --ran printed: 44 derived famil(ies) accounted for — 43 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).
  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD exited 0 over both commits.
  • On the first head c5f8165, 34 commands were derived: 33 exited 0, and dual-build-cjs-loads was not measured. CI there had 28 success, 18 skipped and no failure, until the label was removed and Check Changeset correctly failed on that head (M1).

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No packages/** change.)
  • 2. Every name I added uses the casing for its kind. (No names added.)
  • 3. No formatter ran; pnpm lint passes. (Markdown only.)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (@objectstack/skills: patch.)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (Not touched.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English, except the 维护者速读 block that governed surfaces require.
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J8VVAjjRmCZgXRP1FNQS2n

…hable: true joins the auto-default search set

The data, query and list-views skills taught the record-search auto-default
as type-only. Since the field-level opt-in is honoured (ruling record
6573569376, letter A; `packages/spec/src/data/search-fields.ts`), the set
`$search` scans with no `searchableFields` declared — and the `$searchFields`
allow-list, which is the same set — is the type-based default plus every field
marked `searchable: true`, of any type except `secret`, `password` and
`vector`. Each sentence now says so, and adds what does not change:
`searchable: false`, the default, never removes a field the type default
scans; declaring `searchableFields` chooses the set. The enum half of the
type default is spelled `select` alone, as `SEARCHABLE_ENUM_TYPES` is.

Paid in place within each ratchet ceiling: objectstack-data drops the
duplicate Field Groups pointer stub (the `fieldGroups` row links the same
anchor) and tightens three phrases; list-views merges the two rows each
diagnostic had in the refusal table.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjjRmCZgXRP1FNQS2n
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 3, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Nov 3, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429, 2026-11-03T10:44Z) · head c5f8165

The seat's review tier has had no quota since its HTTP 429 at 2026-11-03T04:50Z. The maintainer's word, 2026-11-03, is 「就是没有fable了,现有任务换 opus 开发,等分诊契约复审」, so this FULL review of a Tier H skills/** PR (card #29395) goes to triage, as on #29781 (handoff 6595797481).

Points for the reviewer:

  • Model. The edits were written under the Fable mandate, and the PR body carries the maintainer's waiver line for the rest.
  • Premise. Ruling 6573569376 letter A, merged in PR feat(spec): a field marked searchable: true is searched when its object declares no searchableFields #29385. Check it against search-fields.ts / field.zod.ts on main.
  • Ratchet (lanes/skills.md line 20: a re-wrap is never a payment):
    • data 6123 → 6121 / 6123. Paid by deleting the duplicate Field Groups pointer stub and tightening three phrases.
    • list-views 3110 → 3128 / 3129. Paid by merging the refusal table's two rows per diagnostic.
    • query 4166 → 4228 / 5547, inside its headroom.
    • The dev reports that the query paragraph and the last line of the data paragraph were re-flowed around the insertion, words unchanged. Judge whether any of that reflow is being counted as payment.
    • Check that each deleted fact keeps a home.
  • Gates. 34 derived: 33 exit 0, and 1 NOT-MEASURED (dual-build-cjs-loads, full build).

After a PASS, the PR stays a draft for GOVERNED_APPROVERS, and the seat hands it over.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract-review-claim: session_01AavokzJ5DndAwitDXvKy4U · head c5f8165 · 2026-11-03T14:14Z

Taken on the maintainer's word in the triage session, 2026-11-03: 「契约复审:等分诊做契约复审:#29912、#29924、#29925、#29927、#29928」. This is an exception to #29667 for the domain:skills#1 handoff 6601548321, while that seat's tier answers 429.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: c5f816530b9696908cb70e623b5d0cfd223cd06a
Local-runs: none
Scope: skills/objectstack-data/SKILL.md, skills/objectstack-query/SKILL.md, skills/objectstack-ui/rules/list-views.md + packages/spec/src/data/search-fields.ts, packages/spec/src/data/field.zod.ts (FieldType, searchable), packages/objectql/src/search-filter.ts, packages/objectql/src/engine.ts (search expansion, empty-set error), packages/metadata-protocol/src/protocol-query-validation.ts ($searchFields gate), packages/lint/src/validate-searchable-fields.ts, packages/lint/src/rule-explanations.ts, skills/objectstack-data/references/examples-objects.md, skills/objectstack-data/rules/relationships.md, the three skills' evals/, scripts/check-skills-token-ratchet.mjs (CEILINGS rows), scripts/check-empty-changeset.mjs, .github/workflows/pr-automation.yml, packages/skills/package.json, .changeset/config.json, AGENTS.md, .claude/skills/pm-dispatch/references/lanes/skills.md

Taken by triage on the maintainer's word 「skills#1 转来的都接」 (exception to #29667; handoff 6601548321).

① Derived judgments

  • Auto-default = type default + every searchable: true field, except secret / password / vector. Right for the three named types: admittedBySearchableFlag (search-fields.ts:189-194) ORed in front of the type filter (:199), SEARCH_FLAG_EXCLUDED_TYPES (:145). Incomplete: the same predicate also excludes a virtual field (isVirtualSearchField, :193; SEARCH_VIRTUAL_TYPES = {formula}, :115). The merged describe states that exception (field.zod.ts:1350-1351). None of the three new sentences carries it (data SKILL.md:118, query SKILL.md:321, list-views :189). See S1.
  • $searchFields allow-list = the same set (query SKILL.md:322-324, list-views table header): right. The ingress gate calls resolveSearchFieldResolution with the raw field map (protocol-query-validation.ts:928-933). The engine passes the same map (engine.ts:14341-14352, search-filter.ts:297-301). The lint mirror carries the flag (validate-searchable-fields.ts:272).
  • searchable: false, the default, never removes a type-default field (data :118-120, query :324-325, list-views :191): right. The flag is read only as === true (search-fields.ts:190), and the default is false (field.zod.ts:1346).
  • "declare searchableFields to choose the set": right. The declared branch is the whole set, and the flag is not read on it (search-fields.ts:329-330).
  • Enum half is select alone; status dropped (data :117, list-views :189): right. SEARCHABLE_ENUM_TYPES = {select} (search-fields.ts:75), and status is not a FieldType member (field.zod.ts:49-120).
  • Public surface. No code, schema or export changes. The only consumer surface is the published @objectstack/skills catalog (see ②).

② Semver level

  • Wrong. The PR carries skip-changeset and adds no .changeset/*.md. skills/** ships as @objectstack/skills (packages/skills/package.json:2-4; skills/README.md:5-6; fixed group in .changeset/config.json). The repo says this in three places: such a change "releases '@objectstack/skills' and never takes the label" (.github/workflows/pr-automation.yml:864); scripts/check-empty-changeset.mjs:518 and :913-918 ("the PR owes a changeset naming that package … never the skip-changeset label … a wrong label is review's catch"); and AGENTS.md:1019-1021 ("never skip-changeset: that label is for a diff that publishes nothing"). The precedents are skills-only changesets with '@objectstack/skills': patch: .changeset/25921-objectui-testing-guide-fetch-double.md, 26303-…, 26502-…. The PR body's Human Minimum box 5 ("skip-changeset: skills text only") is checked against the rule. See M1.
  • Owed level: patch on @objectstack/skills. Metadata-protocol: none takes patch (AGENTS.md:1025-1027).
  • Clause-② line: Clause-②: no / Metadata-protocol: none in the PR body (correct: there is no packages/spec diff and no change to what an author can write). The same two lines are owed in the missing changeset body.

③ Boundary flags

  • PR author objectstack-fleet[bot] (attribution huangyiirene). The commit author is claude.
  • Re-wrap (dev's acceptance note). Not counted as payment, so no breach of lanes/skills.md:20 ("re-wrap 筹行"). The query reflow (SKILL.md:319-327) sits inside 1381 tokens of headroom that needed no payment. The data paragraph's last sentence was already on its last line. The data payment (6123 → 6121) is real deletion: the duplicate → Moved verbatim … § Field Groups (MVP) stub (its anchor still lives at examples-objects.md:3, linked from SKILL.md:92) plus three phrase cuts.
  • Deleted facts keep a home: "computed and stored on write" lives on in rules/relationships.md:308-311. In list-views, the merged rows keep every case. "at all three layers" (list-views.md:206) is a qualifier only, and the row's rule is kept.
  • Ratchet: the diff touches no script. CEILINGS rows are unchanged: data 6123 (check-skills-token-ratchet.mjs:513), query 5547 (:591), list-views 3129 (:867). Data headroom after this PR is 2 tokens, per the PR body.
  • Model: the claim set claude-fable-5-1. The PR body says "developed on Opus", with the mandate waived on the maintainer's word quoted in handoff 6601548321. Handoff 6601548321 also says "written under the Fable mandate", and the two accounts disagree. That is the maintainer's waiver to own, not this review's to rule on.
  • Evals: confirmed that no eval asserts on the auto-default (objectstack-data/evals/hooks-security-seeds-datasources.json:7-10, objectstack-query/evals/filters-pagination-search.json:37-40).
  • Not measured: check:dual-build-cjs-loads (needs a full build; no packages/** diff). CI is the measurement.
  • Escalated for triage, outside this PR's files: engine.ts:2307-2309, the empty-search-set error, still says "none of its fields is a type the default search scans" with no mention of the flag. It is code, not skills/**, so it is no finding here.

④ Design judgment

  • M1 (must-fix) · all three files, PR-level. Replace skip-changeset with a changeset '@objectstack/skills': patch that carries Clause-②: no and Metadata-protocol: none. Correct Human Minimum box 5 to match. See ②.
  • S1 (should-fix) · data SKILL.md:118, query SKILL.md:321, list-views :189. "of any type except secret / password / vector" is false for a virtual formula field: marked searchable: true, it is neither scanned nor admitted (search-fields.ts:193; field.zod.ts:1350-1351). In list-views, the new allowed-set row (:189) now admits what the refusal row (:208) refuses for a flagged formula. Each file contradicts itself, and the more specific row is right. Query has no compensating line. Data is partly covered by :88 and :151-154. No lint catches a formula marked searchable: true: validate-searchable-fields.ts judges only searchableFields entries. A short "(a formula field, having no column, never)" closes it. Data must pay for it in place (2-token headroom).
  • Data SKILL.md: otherwise holds against the code and against the card's scenario (skills: three files teach the record-search auto-default as type-only; after #29008 a field marked searchable: true also joins it when searchableFields is not declared #29395 "Wanted": correct each sentence, plus the unchanged-behaviour line). Both are present.
  • Query SKILL.md: otherwise holds. A pre-existing looseness, "name/title + short-text fields", omits select. This PR did not introduce it, so it is noted, not a finding.
  • List-views rules/list-views.md: otherwise holds. The merged refusal rows match the lint's two diagnostics (validate-searchable-fields.ts:169-170, :452, :531-535).
  • Tried and held (no finding): a flagged lookup scans the stored id, not the title (rule-explanations.ts:2511-2520). Data's mirror block (SKILL.md:122-160) already prescribes the mirror for related-title search. internal: true, credential and field-level-security withholding apply on top of the resolved set (engine.ts:14329-14340, :14353-14370). These are caller and engine narrowings outside the "which set" claim. The skills did not state them before, and the card does not ask for them.

Check-runs at record time: 46 total: 28 success, 18 skipped, 0 failure. Skipped: Type Check UI, Lint UI, Build & E2E UI, Test UI (matrix), Build UI Deps, Dogfood Verify CLI, Temporal Conformance (live PG + MySQL), Build Docs, Dogfood Regression Gate (matrix), UI Published Artifacts, Auto Label (×1 of 2), Packed-tarball smoke (opt-in) ×2, Check Changeset (×1 of 2), 18.x upgrade harness (opt-in) ×2, Check PR Size (×1 of 2), Schedule gate. Check Changeset is green only because of the skip-changeset label (M1).

Implemented-by: claude/project-thread-yb1wlg
Reviewed-by: session_01AavokzJ5DndAwitDXvKy4U

VERDICT: FAIL


Generated by Claude Code


Generated by Claude Code

@objectstack-fleet objectstack-fleet Bot removed the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 3, 2026
…fault; the skills change carries its changeset

Contract review on the first head: the three new sentences said a field
marked `searchable: true` joins the auto-default "of any type except
`secret` / `password` / `vector`", but `admittedBySearchableFlag` also keeps
out a virtual field (`formula`, no stored column). Each sentence now names it,
and the list-views allowed-set table no longer contradicts its own refusal
table: the declared row reads "any stored field type", so the refusal row
drops its restated "(nothing stored to scan)".

Paid in place by same-file restatement cuts: objectstack-data drops
"no traversal" from the `?search=apollo` line (the section's opening says the
search axis does not resolve traversal) and the `// ← the mirror` code comment
(the block's first comment names the mirror); list-views as above.

A `skills/**` change publishes `@objectstack/skills`, so it carries a patch
changeset instead of the skip-changeset label.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjjRmCZgXRP1FNQS2n
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429, 2026-11-03T14:46Z) · head b89c05d

The seat's review tier still has no quota (429 at 2026-11-03T04:50Z). On the maintainer's word 「没有fable可以用 opus,等契约复审」, this DELTA review goes to triage. It answers triage's review 6606434667 on c5f81653, card #29395.

What to check:

  • M1. .changeset/29395-skills-search-auto-default.md ('@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none). skip-changeset is removed.
  • S1. "or a virtual formula" is added at data L118, query L321 and list-views L189, per search-fields.ts:193. The list-views declared row now reads "any stored field type", so it no longer contradicts the refusal row.
  • Payments, all same-file. Check each fact still has a home and nothing was re-wrapped:
    • Data drops "no traversal" from the ?search=apollo line; the home is the section opening.
    • Data drops the // ← the mirror comment; the home is the block's first comment.
    • List-views drops "(nothing stored to scan)"; the home is "any stored field type".
  • Tokens: data 6119/6123, query 4234/5547, list-views 3126/3129.
  • Gates: 44 derived. 43 exit 0; 1 is NOT-MEASURED (dual-build-cjs-loads, full build; CI's Build Core reads it).

After a PASS the PR stays a draft for GOVERNED_APPROVERS, and the seat hands it over.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract-review-claim: session_01AavokzJ5DndAwitDXvKy4U · head b89c05d · 2026-11-03T14:48Z

A delta after triage's FAIL; the maintainer's standing 「skills#1 转来的都接」.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b89c05dd4ab364c49e74edca046754e555280343
Local-runs: none
Scope: DELTA c5f81653 → b89c05dd: skills/objectstack-data/SKILL.md, skills/objectstack-query/SKILL.md, skills/objectstack-ui/rules/list-views.md + .changeset/29395-skills-search-auto-default.md. The rest carries from triage's full record on c5f81653 (FAIL: M1 changeset; should-fix S1 virtual formula).

Taken on the maintainer's standing word 「skills#1 转来的都接」 (handoff 6606884997).

① Derived judgments

  1. M1 is fixed. The skip-changeset label is gone (labels are now documentation, size/s, tooling). .changeset/29395-skills-search-auto-default.md declares '@objectstack/skills': patch with Clause-②: no and Metadata-protocol: none. Check Changeset is success on the changeset.
  2. S1 is fixed in all three files. "of any type except secret / password / vector or a virtual formula" now appears at objectstack-data/SKILL.md:118, objectstack-query/SKILL.md:321 and list-views.md:189. That matches search-fields.ts:193 and the merged field.zod.ts describe. The list-views allowed-set row and its refusal row (:208) no longer contradict each other.
  3. list-views declares searchableFields row: it now reads "that list, verbatim — any stored field type", where it said "whatever the field types are". That is more exact, since a declared virtual formula is refused (row :208).
  4. Token payments:
    • // ← the mirror: the block's own lead comment ("project_name is a stored, denormalized mirror of the parent's title") still says it.
    • "no traversal": "one single-table scan" still says it.
    • "(nothing stored to scan)": objectstack-data/SKILL.md "It is virtual (no column to scan)" still teaches the reason.
      No teaching is lost. No ceiling row moved (scripts/** is untouched), and Lint & Repo Gates is success on the head.

② Semver level

'@objectstack/skills': patch, which is right. Clause-②: no and Metadata-protocol: none are right.

③ Boundary flags

  • Escalated in the full record and still owed outside this PR: engine.ts:2307-2309's empty-search-set error text still describes the default as type-only. That is a domain:server follow-up card.
  • The PR author is objectstack-fleet[bot]. Tier H (skills/**): this record does not lift the landing.

④ Design judgment

The three skills now teach one rule, worded the same way: the type default, plus searchable: true fields except the four excluded kinds. searchable: false never subtracts, and a declared searchableFields chooses the set. It holds.

Check-runs on b89c05dd at record time: 45 check-runs, 30 success, 15 skipped, 0 failure, 0 in progress.

Implemented-by: claude/project-thread-yb1wlg
Reviewed-by: session_01AavokzJ5DndAwitDXvKy4U

VERDICT: PASS


Generated by Claude Code


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

席位核对 — ACCEPT · domain:skills#1 · head b89c05dd4ab364c49e74edca046754e555280343

  1. 形态: draft → main,Fixes #29395;作者 objectstack-fleet[bot];文件在认领面内,附 @objectstack/skills patch changeset(⛔ 不挂 skip-changeset)。
  2. 前提实测: 复核记录逐条对过合并后的代码;本席核对复核结论与 PR 正文一致。
  3. 门禁(钉 head b89c05dd): check-runs skipped 15 / success 30,无失败。派生门禁见 PR 正文。
  4. 接受的偏差: 开发在 Opus 上进行、契约复核由分诊代审,均依维护者原话。
  5. 范围外去向: engine.ts:2307-2309 空搜索集报错文案仍是旧说法,属 domain:server,另行立卡。
  6. 落地条款: Tier H。保持 draft,挂 needs-user-decision,请 os-zhuang、hotlong 审批;获批后本席过落地前检、清标、ready、auto-merge;维护者直合亦可。

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review November 3, 2026 16:00
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 3, 2026
Merged via the queue into main with commit 0d40aa1 Nov 3, 2026
51 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-yb1wlg branch November 3, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

3 participants